<?php
class Delivery_Model_Mapper_Negocios
	extends Delivery_Model_Mapper_Abstract
{
	
	public function getDbTable()
	{
		return parent::getDbTable( 'Negocios' );
	}
	
	public function save ( $negocio ){
		
		$dbTable= $this->getDbTAble();
		
		if ( ! $negocio->getId() ){
			return $negocio->idNegocio = $dbTable->insert( $negocio );		
		} else {
			return $dbTable->update( $negocio );	
		}			
	}
	
	public function delete( $negocio )
	{
		$dbTable= $this->getDbTAble();
		
		$mapper = Delivery_Model_Factory::mapper('Pedidos');
		//chequeo si el negocio tiene pedidos, entonces lo desactivo
		if ( $mapper->inAnyOrder( $negocio ) ){			
			
			$this->activo = 0;			
			return $dbTable->update( $negocio );
		} else {
			$this->logDeleted( $negocio );
		}						
		
		return $dbTable->delete( $negocio );
	}
	
	/**
	 * @param int $idNegocio
	 * @return object Delivery_Model_Negocio
	 */
	public function getById( $idNegocio ){
	
		if ( $this->getIdentityMap()->isRegistered( 'Delivery_Model_Negocio', $idNegocio )){
			return $this->getIdentityMap()->get( 'Delivery_Model_Negocio', $idNegocio );
		}
		
		$dbTable= $this->getDbTAble();
		$row	= $dbTable->getById( $idNegocio );
	
		if( empty($row) ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::COMMERCE_NOT_FOUND );
		}
		
		return $this->_fetch( $row );
	}
	
	/**
	 * @param string url
	 * @return objct Delivery_Model_Negocio
	 */
	public function getByUrl( $url ){
	
		$dbTable= $this->getDbTAble();
		$row	= $dbTable->getByUrl( $url );
	
		if( empty($row) ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::COMMERCE_NOT_FOUND );
		}
		
		return $this->_fetch( $row );
	}
	
	public function getByEmail( $email ){
	
		$dbTable= $this->getDbTAble();
		$row	= $dbTable->getByEmail( $email );
	
		if( empty($row) ){
			throw new Delivery_Model_Exception( Delivery_Model_Exception::COMMERCE_NOT_FOUND );
		}
		
		return $this->_fetch( $row );
	}
	
	
	public function getAll()
	{
	    return $this->getByParams(array());
	}
	
	public function getByIds( $ids )
	{
	    $loaded = new Delivery_Model_Collection_Negocios;
	    
	    foreach( $ids as &$idNegocio){
    	    if ( $this->getIdentityMap()->isRegistered( 'Delivery_Model_Negocio', $idNegocio )){
    			$loaded->append( $this->getIdentityMap()->get( 'Delivery_Model_Negocio', $idNegocio ) );
    			unset($idNegocio);
    		}
	    }
	    
		$dbTable= $this->getDbTAble();
		
		if( !empty($ids)){    
    		$negocios = $this->_fetchCollection(
    			'Negocios',
    			$dbTable->getByIds( $ids )
    		);
		} else {
		    return $loaded;    
		}
		
	    foreach( $loaded as $negocio ){
    	    $negocios->append($negocio);
	    }
		
		return $negocios;
	}
	
	public function getByCocina( $idCocina )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Negocios',
			$dbTable->getByCocina( $idCocina )
		);
	}
	
	public function getByTag( $idTag )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Negocios',
			$dbTable->getByTag( $idTag )
		);
	}
	
	public function getByCiudad( $idCiudad )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Negocios',
			$dbTable->getByCiudad( $idCiudad )
		);
	}
	
    public function getByCiudadAndTag( $idCiudad, $idTag )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Negocios',
			$dbTable->getByCiudadAndTag( $idCiudad, $idTag )
		);
	}
	
	public function find( $key, $direccion = null , $offset, $limit, $orderBy)
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Negocios',
			$dbTable->search( $key, $direccion, $offset, $limit, $orderBy )
		);
	}
	
	public function findCount( $key, $direccion = null , $offset, $limit, $orderBy){
	
		$dbTable= $this->getDbTAble();
				
		return $dbTable->searchCount( $key, $direccion, $offset, $limit, $orderBy );
	}
	
	public function nuevos( $cantidad, $filterIds = null )
	{		
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Negocios',
			$dbTable->getByParams( array('abierto' => 1), 0, $cantidad, "fechaCreacion DESC", $filterIds )
		);
	}
	
    public function recomendados( $cantidad, $filterIds = null )
	{		
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Negocios',
			$dbTable->getByParams( array('abierto' => 1), 0, $cantidad, 'ranking DESC', $filterIds )
		);
	}
	
	public function all()
	{		
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Negocios',
			$dbTable->all()
		);
	}
	
	public function getByParams( $params, $offset = null, $limit = null, $order = null )
	{
		$dbTable= $this->getDbTAble();
		
		return $this->_fetchCollection(
			'Negocios',
			$dbTable->getByParams($params, $offset, $limit, $order)
		);
	}
	
	public function countByParams( $params )
	{
		return $this->getDbTAble()->countByParams($params);
	}
	
	
	public function loadDireccion( $negocios )
	{
		$mapper = Delivery_Model_Factory::mapper('Direcciones');
		
		if ( $negocios instanceof Delivery_Model_Collection_Negocios && count($negocios)){
		
			$direcciones = $mapper->getByIds( $negocios->getKeyValues( 'idDireccion', true ) );
			
			foreach ( $negocios as $negocio){
				$negocio->setDireccion(
					$direcciones->offsetGet( $negocio->idDireccion )
				);
			}
			
		}
		
	 	elseif ( $negocios instanceof Delivery_Model_Negocio){
			
	 		$negocios->setDireccion(
	 			$mapper->getById( $negocios->idDireccion )
	 		);
		}
	}
	
	public function loadProductos( $negocios )
	{
		$mapper = Delivery_Model_Factory::mapper('Productos');
		
		if ( $negocios instanceof Delivery_Model_Collection_Negocios && count($negocios)){
		
			$productos = $mapper->getByNegocio( $negocios->getIds() );
			
			$mapper->loadCategoria( $productos );
			
			foreach ( $negocios as $negocio){
				
				$negocio->setProductos(
					$productos->getByKey( 'idNegocio', $negocio->getId() )
				);
			}
		}
		
	 	elseif ( $negocios instanceof Delivery_Model_Negocio){
			
	 		$productos = $mapper->getByNegocio( $negocios->getId() );
	 		$mapper->loadCategoria( $productos );
	 		
	 		$negocios->setProductos( $productos );
		}
	}
	
	public function loadPromociones( $negocios )
	{
		$mapper = Delivery_Model_Factory::mapper('Promociones');
		
		if ( $negocios instanceof Delivery_Model_Collection_Negocios && count($negocios)){
		
			$promociones = $mapper->getByNegocio( $negocios->getIds() );
			
			foreach ( $negocios as $negocio){
				
				$negocios->setPromociones(
					$promociones->getByKey( 'idNegocio', $negocio->getId() )
				);
			}
		}
		
	 	elseif ( $negocios instanceof Delivery_Model_Negocio){
			
	 		$negocios->setPromociones(
	 			$mapper->getByNegocio( $negocios->getId() )
	 		);
		}
	}
	
	public function loadZonas( $negocios )
	{
		$mapper = Delivery_Model_Factory::mapper('Zonas');
		
		if ( $negocios instanceof Delivery_Model_Collection_Negocios && count($negocios)){
		
			$zonas = $mapper->getByNegocio( $negocios->getIds() );
			
			foreach ( $negocios as $negocio){
				
				$negocio->setZonas(
					$zonas->getByKey( 'idNegocio', $negocio->getId() )
				);
			}
		}
		
	 	elseif ( $negocios instanceof Delivery_Model_Negocio){
	 		$negocios->setZonas( 
				$mapper->getByNegocio( $negocios->getId() )
	 		);
		}
	}
	
	public function loadTags( $negocios )
	{
		$mapper = Delivery_Model_Factory::mapper('TagsNegocio');
		
		if ( $negocios instanceof Delivery_Model_Collection_Negocios && count($negocios)){
		
			$tags = $mapper->getByNegocio( $negocios->getIds() );
			
			foreach ( $negocios as $negocio){
				
				$negocio->setTags(
					$tags->getByKey( 'idNegocio', $negocio->getId() )
				);
			}
		}
		
	 	elseif ( $negocios instanceof Delivery_Model_Negocio){
	 		$negocios->setTags( 
				$mapper->getByNegocio( $negocios->getId() )
	 		);
		}
	}
	
	public function loadHorarios( $negocios )
	{
		$mapper = Delivery_Model_Factory::mapper('Horarios');
		
		if ( $negocios instanceof Delivery_Model_Collection_Negocios && count($negocios)){
		
			$horarios = $mapper->getByNegocio( $negocios->getIds() );
			
			foreach ( $negocios as $negocio){
				
				$negocio->setHorarios(
					$horarios->getByKey( 'idNegocio', $negocio->getId() )
				);
			}
		}
		
	 	elseif ( $negocios instanceof Delivery_Model_Negocio){
	 		$negocios->setHorarios( 
				$mapper->getByNegocio( $negocios->getId() )
	 		);
		}
	}
	
    public function loadVotos( $negocios )
	{
		$mapper = Delivery_Model_Factory::mapper('Votos');
		
		if ( $negocios instanceof Delivery_Model_Collection_Negocios && count($negocios)){
		
			$votos = $mapper->getByNegocio( $negocios->getIds() );
			
			foreach ( $negocios as $negocio){
				
				$negocio->setVotos(
					$votos->getByKey( 'idNegocio', $negocio->getId() )
				);
			}
		}
		
	 	elseif ( $negocios instanceof Delivery_Model_Negocio){
	 		$negocios->setVotos( 
				$mapper->getByNegocio( $negocios->getId() )
	 		);
		}
	}
	
	
	/**
	 * @param array
	 * @return object Delivery_Model_Negocio
	 */
	protected function _fetch( $row )
	{
		$negocio = new Delivery_Model_Negocio( $row );
		
		$this->getIdentityMap()->set( $negocio, $negocio->getId() );
		
		return $negocio;
	}
	
	
}